
const express = require('express');

// 要使用node自带的http模块来维护端口的监听 
// 使用node 的createSever目的是能让express跟socket公用一个端口
const { createServer }  = require('http') 
const app = express();

// 第一步安装 socket.io server  https://socket.io/docs/v4/server-initialization/#with-express
// npm i socket.io  

//  第二步引入socket Server
const { Server} = require('socket.io');

// 使用原生node的createServer来包括express实例 方便跟io共享同一个端口
const httpServer = createServer(app);
// 第三步 创建io实例
const io = new Server(httpServer,{}); // 创建一个io实例  这个实例就是负责对于socket通讯进行处理的实例对象



app.use('/sc',express.static('assets'))


//  socket在服务端的主要业务逻辑

io.on('connect',socket=>{



    ///  socket 就是跟服务端建立的通讯实例

    console.log('有个客户跟我建立连接了！！！')

    // console.log('scoketid',socket.id,socket.handshake.query)

    // 监听自定义事件
    socket.on('kfc',res=>{
        console.log('服务端接收到了一个kfc事件',res);

        // io.emit(自定义的事件名,传递的参数) 向所有的客户端推送消息
        // io.emit('abc',9999)
        // socket.emit(自定义事件名，传递的参数) 仅向当前的客户推送详细
        socket.emit('abc',9999)
    })

    socket.on('ilikeweekend',()=>{
        // socket.join(房间名称)
        socket.join('yep'); 
    })

    socket.on('send',res=>{
        // io.to(指定房间名).emit 向指定的房间名的客户推送消息
        io.to('yep').emit('msg','有新的消息'+res)
    })

    socket.on('newmsg', data=>{
        const { who ,msg ,from} = data;

        // 获取所有的在线的socket实例

        // socket.nsp.sockets  这是一个Map对象  // 所有的当前的语服务端正在连接中的socket客户 
        const onlineList = []; // 通过nsp.sockets 来组织一个在线用户的数组
        socket.nsp.sockets.forEach(item=>{
            onlineList.push({
                    // socket实例上面得到的连接的时候传递的query当中uname参数
                    uname: item.handshake.query.uname, 
                     // socket实例上面的 socketid
                    socketid: item.id 
             })
        })

        // 在 在线的用户当中得到接受消息的用户的socket.id
        const theone  = onlineList.find(item=> item.uname === who );

         console.log('theone' ,theone)
        //  io.to(指定的用户的socket id) 向指定id的用户进行消息推送
        io.to(theone.socketid).emit('p2p',{
            msg,
            from
        })

    })
})







httpServer.listen(5000,()=>{
    console.log('app is running at port 5000');
})
